# 引入itchat
import itchat
import csv  # 写入数据
import pandas as pd  # 读取数据
from pyecharts import Pie  # 饼状图
from pyecharts import Map  # 地图
import re  # 正则去掉部分非法字符
import jieba.analyse  # jieba分词统计
from wordcloud import WordCloud, ImageColorGenerator  # 绘图
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import time

# 需要安装以上所有模块的支持，如果没有安装过对应的模块
# 本人使用的是anaconda3的Python环境
# pip install itchat
# pip install pyecharts
# pip install echarts-countries-pypkg
# pip install echarts-china-provinces-pypkg
# pip install echarts-china-cities-pypkg
# pip install echarts-china-counties-pypkg
# pip install echarts-china-misc-pypkg
# pip install jieba
# pip install 项目文件地址/kenged/pyecharts_snapshot-0.1.9-py2.py3-none-any.whl
# pip install 项目文件地址/kenged/wordcloud-1.5.0-cp36-cp36m-win_amd64.whl
# 如还缺少个别模块，请自行查找安装方式

# ****************************************************    注意   ****************************************
# 初次运行请一次性打开 我标注的 一（36行附近），二（64行附近），三（70行附近） 的代码注释，执行之后会在项目info_friend目录下生产friends_日期.csv,
#   代表个人微信所有好友，如需打开查看，请使用excel打开,之后注释掉这三个模块即可，如果想测试发送消息，请打开 一(36行附近)
#   其它操作可不打开

#     一，   自动登录，微信扫描二维码登录
# ========================================解开注释运行 start====================================
# itchat.auto_login()
# ========================================解开注释运行 end====================================

# 给文件助手发消息
# ========================================发消息演示 解开注释运行 start====================================
# itchat.send_msg("Hello", "filehelper");

# 给微信号有发消息 方式一:
# 查找群聊发送 注意填写的是备注名称
# users = itchat.search_chatrooms(name=u'玩游戏?不可能')
# 查找朋友发送 注意填写的是备注名称
# users = itchat.search_friends(name=u'冯昊')
# 找到UserName
# userName = users[0]['UserName']
# 然后给他发消息
# itchat.send('hello', toUserName=userName)


# 给微信号有发消息 方式二:
# user = itchat.search_friends(name=u'冯昊')[0]
# user.send(u'机器人say hello')
# ========================================发消息演示 解开注释运行 end====================================


# 微信好友统计可视化
#   二  .数据收集
# 首先通过itchat获取好友的信息，第一个其实是自己，所以保存数据需要跳过第一个好友
# ========================================解开注释运行 start====================================
# friends = itchat.get_friends(update=True)[0:]
# print(friends[0])
# ========================================解开注释运行 end====================================

#   三   根据分析情况，获取部分字段数据，并保存在csv文件中
# ========================================解开注释运行 start====================================
currTime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()));
# f = open("infoFriend/friends_" + currTime + ".csv", "w+", encoding="utf_8_sig", newline="")
# writer = csv.writer(f)
# writer.writerow(['NickName', 'Sex', 'City', 'Province', 'Signature'])
# for i in friends[1:]:
#     writer.writerow([i['NickName'], i['Sex'], i['City'], i['Province'], i['Signature']])
# # 数据写入完成
# ========================================解开注释运行 end====================================


# pandas读数据
df = pd.read_csv(open("infoFriend/friends_" + currTime + ".csv", encoding="utf_8_sig"))
# 全部输出
# print(df)
# 输出前十条
# print(df[:10])

# 性别分布
#  首先对性别进行统计（慌得一匹），并使用pyecharts库进行可视化分析。如图可以看出，男性比例还是更多一些的，外星人是没有设置性别的好友。

# ========================================解开注释运行 start====================================
# data1 = df.groupby('Sex')['Sex'].count()
# attr = [u'外星人', u'男性', u'女性']
# v1 = list(data1)
# pie = Pie(u'微信好友性别分布')
# pie.add("", attr, v1, is_label_show=True)
# # 显示配置信息，实际没用
# pie.show_config()
# # 绘制饼状图
# pie.render(path="output/pie_"+currTime+".html")
# ========================================解开注释运行 end====================================


# 地区分布
# 地区字段有缺失值，我们通过布尔选择过滤到缺失值后，通过groupby统计个数，利用pyecharts库进行可视化。
# 由于本人是湖南人，并且求学一直都没有离开过湖南，所以湖南的人数最多，其他省份的人数都是较少的。
# ========================================解开注释运行 start====================================
# new_df2 = df[df['Province'].notnull()]
# data = new_df2.groupby('Province')['Province'].count()
# label = list(data.index)
# value = list(data)
# map = Map(u'微信好友地区分布情况', width=1200, height=600)
# map.add("", label, value, maptype='china', is_visualmap=True, visual_text_color='#000')
# map.render(path="output/map_"+currTime+".html")
# ========================================解开注释运行 end====================================









# 词云图
# 最后，通过jieba分词，计算词频，绘制好友个性签名的词云图。曾经我们90后的杀马特QQ昵称、个性签名，大家是否还记得？情殇、浅唱、爱你就是一辈子....还记得我最早的QQ昵称是泷太子...
# 这里可以看到本人微信好友英语不错的样子，各种英语秀的我头皮发麻，他们时而愤青（个性、随意），不远随波逐流；
# 时而低落（浅醉、唯心），为生活颠簸；
# 最后不得而变得中庸（平凡，留不住）。
# ========================================解开注释运行 start====================================
# siglist = []
# new_df = df[df['NickName'].notnull()]
# for nickname in list(new_df["NickName"][:100]):
#     #  # 正则删掉一些冗余符号
#     nickname = nickname.replace("span", "").replace("class", "").replace("emoji", "")
#     rep = re.compile("1f\d+\w*|[<>/=]")
#     # 调用sub实现替换
#     nickname = rep.sub("", nickname)
#     siglist.append(nickname)  # 得到text文本
# text = " ".join(siglist)
# # 读入背景图片（提前准备好！）
# coloring = np.array(Image.open("cloudImg/timg.png"))
# # 对签名文件jieba
# wordlist_after_jieba = jieba.cut(text, cut_all=True)
# # 将jieba后的文件组合到wl_space_split中
# wl_space_split = " ".join(wordlist_after_jieba)
# # 实例化对象
# my_wordcloud = WordCloud(background_color="white",  # 背景颜色
#                          max_words=2000,  # 最大词数
#                          mask=coloring,  # 设置背景图片
#                          max_font_size=40,  # 显示字体最大值
#                          random_state=42,  # 设置有多少种随机生成状态（有多少种配色方案）
#                          scale=2,  # 比例
#                          font_path="font/Droid Sans Fallback.ttf")  # 选择字体解决口字形问题
# # 写 text是将原始名称分词  写wl_space_split是使用jieba分词后的效果
# my_wordcloud.generate(text)
# # 根据图片生成词云相应颜色
# image_colors = ImageColorGenerator(coloring)
# my_wordcloud.recolor(color_func=image_colors)
# # 2、完整图片输出
# my_wordcloud.to_file("output/cloudImg_"+currTime+".png")
# # 显示图片
# plt.imshow(my_wordcloud.recolor(color_func=image_colors))
# plt.axis("off")
# plt.show()
# ========================================解开注释运行 end====================================
